package co.gov.medellin.ssti.sub.model.dao.impl;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Types;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import co.gov.medellin.ssti.sub.common.ConexionFactory;
import co.gov.medellin.ssti.sub.model.dao.ISubprogramaDAO;
import co.gov.medellin.ssti.sub.model.dao.exception.DAOException;
import co.gov.medellin.ssti.sub.model.vo.AtributoVO;
import co.gov.medellin.ssti.sub.model.vo.SubprogramaVO;
import co.gov.medellin.ssti.sub.web.form.SubprogramaForm;

public class SubprogramaDAOImpl extends BaseDAOImpl implements ISubprogramaDAO {

	// **************************************
	// QUERYS
	// **************************************

	private static final String SELECT_TODOS_SUBPROGRAMAS = "SELECT DISTINCT CODIGO, NOMBRE, DESCRIPCION, DIAS_REUTILIZAR, "
			+ "GRUPO_FAMILIAR, VALIDAR_CONTRA_ESTUD,  VALIDAR_CONTRA_SISBEN, "
			+ "DIRECCION_BEN_OBLIGATORIA, nvl(VALOR_UNITARIO_BENEFICIO,0) VALOR_UNITARIO_BENEFICIO, "
			+ "DESDE_VIGENCIA, HASTA_VIGENCIA, VIGENCIA,COD_PROGRAMA, NOM_PROGRAMA, COD_CATEGORIA, "
			+ "NOM_CATEGORIA, COD_AREA FROM VCS_BEN_SUBPROG_ALLOWED "
			+ "WHERE VIGENCIA = 'A' ORDER BY NOMBRE ";

	private static final String SELECT_BY_PROGRAMA = "SELECT DISTINCT CODIGO, NOMBRE, DESCRIPCION, DIAS_REUTILIZAR, "
			+ "GRUPO_FAMILIAR, VALIDAR_CONTRA_ESTUD,  VALIDAR_CONTRA_SISBEN, "
			+ "DIRECCION_BEN_OBLIGATORIA, nvl(VALOR_UNITARIO_BENEFICIO,0) VALOR_UNITARIO_BENEFICIO, "
			+ "DESDE_VIGENCIA, HASTA_VIGENCIA, VIGENCIA,COD_PROGRAMA, NOM_PROGRAMA, COD_CATEGORIA, "
			+ "NOM_CATEGORIA, COD_AREA FROM VCS_BEN_SUBPROG_ALLOWED "
			+ "WHERE VIGENCIA = 'A' AND COD_PROGRAMA = ? ORDER BY NOMBRE ";

	private static final String SELECT_GESTOR = "SELECT CODIGO, TIPO_ATRIBUTO, NOMBRE, REST_CODIGO, ORDEN, LONGITUD, "
			+ "OBLIGATORIO, ETIQUETA, VALOR_SUGERIDO, VALIDAR_LISTA, VIGENCIA, "
			+ "TTVF_CODIGO_DOMINIO, DESCRIPCION, TIPO_DATO FROM TCS_BEN_SUBP_ATR_BENEFICIARIO "
			+ "WHERE UPPER(TRIM(NOMBRE)) = 'GESTOR' AND SBPR_CODIGO = ? ";

	private static final String SELECT_GF_FROM_TCS_BEN_SUBPROG_BY_CODESUBP = "SELECT GRUPO_FAMILIAR FROM TCS_BEN_SUBPROGRAMA WHERE CODIGO = ? AND GRUPO_FAMILIAR='S'";

	public SubprogramaDAOImpl(Connection con) {
		super(con);
	}

	/**
	 * 
	 * @return
	 */
	public List<SubprogramaVO> loadAllSubprogramas() throws DAOException {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		List<SubprogramaVO> subprogramas = new ArrayList<SubprogramaVO>();

		try {
			pstmt = conn.prepareStatement(SELECT_TODOS_SUBPROGRAMAS);
			rst = pstmt.executeQuery();
			while (rst.next()) {
				SubprogramaVO subprograma = new SubprogramaVO();
				subprograma.setCode(new Long(rst.getLong("CODIGO")));
				subprograma.setNombre(rst.getString("NOMBRE"));
				subprogramas.add(subprograma);
			}
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}
		return subprogramas;
	}

	/**
	 * 
	 * @return
	 */
	public List<SubprogramaVO> loadAllSubprogramasByPrograma(String programaCode)
			throws SQLException {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		List<SubprogramaVO> subprogramas = new ArrayList<SubprogramaVO>();

		try {
			pstmt = conn.prepareStatement(SELECT_BY_PROGRAMA);
			pstmt.setString(1, programaCode);
			rst = pstmt.executeQuery();
			while (rst.next()) {
				SubprogramaVO subprograma = new SubprogramaVO();
				subprograma.setCode(new Long(rst.getLong("CODIGO")));
				subprograma.setNombre(rst.getString("NOMBRE"));
				subprogramas.add(subprograma);
			}
		} catch (SQLException e) {
			throw e;
		} finally {
			close(rst, pstmt);
		}
		return subprogramas;
	}

	public AtributoVO getGestor(String codeSubprograma) throws SQLException {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		AtributoVO gestor = null;

		try {
			pstmt = conn.prepareStatement(SELECT_GESTOR);
			pstmt.setString(1, codeSubprograma);
			rst = pstmt.executeQuery();
			if (rst.next()) {
				gestor = new AtributoVO();
				gestor.setCodigo(rst.getString("CODIGO"));
				gestor.setCodatributo(rst.getString("CODIGO"));
				gestor.setValorsugerido(rst.getString("VALOR_SUGERIDO"));
				gestor.setTipovalorflex(rst.getString("TTVF_CODIGO_DOMINIO"));

				String strdominio = rst.getString("VALIDAR_LISTA");
				if (strdominio.equals("S")) {
					// gestor.setValoresflexibles(llenarLista(atr));
					// gestor.setDesvalorsugerido(getDesVFL(atr));
				}
			}
		} catch (SQLException e) {
			throw e;
		} finally {
			close(rst, pstmt);
		}
		return gestor;
	}

	public Collection<SubprogramaVO> findSubprogramaByCriteria(
			SubprogramaVO criteria) throws DAOException {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		String strSql = "SELECT subpro.CODIGO,subpro.NOMBRE, subpro.DESCRIPCION, "
				+ " subpro.DIAS_REUTILIZAR, subpro.GRUPO_FAMILIAR, subpro.VALIDAR_CONTRA_ESTUD, "
				+ " subpro.VALIDAR_CONTRA_SISBEN, subpro.DIRECCION_BEN_OBLIGATORIA, nvl(subpro.VALOR_UNITARIO_BENEFICIO,0) VALOR_UNITARIO_BENEFICIO, "
				+ " subpro.DESDE_VIGENCIA, subpro.HASTA_VIGENCIA, subpro.VIGENCIA, pro.CODIGO COD_PROGRAMA, "
				+ " pro.NOMBRE NOM_PROGRAMA, usu.CODIGO COD_USUARIO, usu.NOMBRE NOM_USUARIO, "
				+ " vflex.CODIGO COD_CATEGORIA, vflex.DESCRIPCION NOM_CATEGORIA "
				+ " FROM TCS_BEN_SUBPROGRAMA subpro, "
				+ " TCS_BEN_PROGRAMA pro, "
				+ " paoyer.TCS_USUARIO usu, "
				+ " paoyer.TCS_VALOR_FLEXIBLE vflex "
				+ " WHERE subpro.PRG_CODIGO = pro.CODIGO "
				+ " AND subpro.USU_CODIGO = usu.CODIGO "
				+ " AND vflex.CODIGO (+)= subpro.VFL_CODIGO_CATEGORIA ";

		StringBuffer query = new StringBuffer(strSql);
		List<Object> parameters = new ArrayList<Object>();

		if (criteria.getCode() != null) {
			query.append(" AND subpro.CODIGO = ? ");
			parameters.add(criteria.getCode());
		}
		if (!criteria.getNombre().equalsIgnoreCase("")) {
			query.append(" AND subpro.NOMBRE LIKE ? ");
			parameters.add("%" + criteria.getNombre().toUpperCase().trim()
					+ "%");
		}
		if (criteria.getCodePrograma() != null) {
			query.append(" AND pro.CODIGO = ? ");
			parameters.add(criteria.getCodePrograma());
		}
		query.append(" ORDER BY subpro.NOMBRE");

		ArrayList<SubprogramaVO> subprogramas = new ArrayList<SubprogramaVO>();
		SubprogramaVO subpro = null;
		try {
			pstmt = conn.prepareStatement(query.toString());
			pstmt = setQueryParameters(pstmt, parameters);
			rst = pstmt.executeQuery();
			while (rst.next()) {
				subpro = new SubprogramaVO();
				subpro.setCode(new Long(rst.getLong("CODIGO")));
				subpro.setNombre(rst.getString("NOMBRE"));
				subpro.setDescripcion(rst.getString("DESCRIPCION"));
				subpro.setDiasReutilizar(rst.getString("DIAS_REUTILIZAR"));
				subpro.setGrupoFamiliar(rst.getString("GRUPO_FAMILIAR"));
				subpro.setValidarEstud(rst.getString("VALIDAR_CONTRA_ESTUD"));
				subpro.setValidarSisben(rst.getString("VALIDAR_CONTRA_SISBEN"));
				subpro.setDirBenObligatoria(rst
						.getString("DIRECCION_BEN_OBLIGATORIA"));
				subpro.setValorUnitarioBeneficio(rst
						.getString("VALOR_UNITARIO_BENEFICIO"));
				subpro.setDesdeVigencia(rst.getString("DESDE_VIGENCIA"));
				subpro.setHastaVigencia(rst.getString("HASTA_VIGENCIA"));
				subpro.setVigencia(rst.getString("VIGENCIA"));
				subpro.setCodePrograma(new Long(rst.getLong("COD_PROGRAMA")));
				subpro.setNombrePrograma(rst.getString("NOM_PROGRAMA"));
				subpro.setCodeUsuario(new Long(rst.getLong("COD_USUARIO")));
				subpro.setNombreUsuario(rst.getString("NOM_USUARIO"));
				subpro.setCodeCategoria(new Long(rst.getLong("COD_CATEGORIA")));
				subpro.setDescCategoria(rst.getString("NOM_CATEGORIA"));
				subprogramas.add(subpro);
				subpro = null;
			}
			return subprogramas;
		} catch (Exception e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}
	}

	public Collection<SubprogramaVO> findInformacionSubprogramaByCriteria(
			SubprogramaVO criteria) throws DAOException {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		String strSql = "SELECT subpro.CODIGO,subpro.NOMBRE, subpro.DESCRIPCION, "
				+ "subpro.DIAS_REUTILIZAR, subpro.CAMPO_A3 DIAS_RENOVAR, subpro.GRUPO_FAMILIAR, subpro.VALIDAR_CONTRA_ESTUD, "
				+ "subpro.VALIDAR_CONTRA_SISBEN, subpro.DIRECCION_BEN_OBLIGATORIA, nvl(subpro.VALOR_UNITARIO_BENEFICIO,0) VALOR_UNITARIO_BENEFICIO, "
				+ "to_char(subpro.DESDE_VIGENCIA,'dd/mm/rrrr')DESDE_VIGENCIA, "
				+ "to_char(subpro.HASTA_VIGENCIA,'dd/mm/rrrr')HASTA_VIGENCIA , subpro.VIGENCIA, "
				+ "subpro.AREA_CODIGO, area.NOMBRE NOM_AREA, subpro.COMENTARIO, "
				+ "pro.CODIGO COD_PROGRAMA, "
				+ "pro.NOMBRE NOM_PROGRAMA, usu.CODIGO COD_USUARIO, usu.NOMBRE NOM_USUARIO, "
				+ "vflex.CODIGO COD_CATEGORIA, vflex.DESCRIPCION NOM_CATEGORIA "
				+ "FROM TCS_BEN_SUBPROGRAMA subpro, "
				+ "TCS_BEN_PROGRAMA pro, TCS_BEN_AREA area, "
				+ "paoyer.TCS_USUARIO usu, "
				+ "paoyer.TCS_VALOR_FLEXIBLE vflex "
				+ "WHERE subpro.PRG_CODIGO = pro.CODIGO "
				+ "AND subpro.USU_CODIGO = usu.CODIGO "
				+ "AND area.CODIGO = subpro.AREA_CODIGO "
				+ "AND vflex.CODIGO (+)= subpro.VFL_CODIGO_CATEGORIA ";
		StringBuffer query = new StringBuffer(strSql);
		List<Object> parameters = new ArrayList<Object>();

		if (criteria.getCode() != null) {
			query.append("AND subpro.CODIGO = ? ");
			parameters.add(criteria.getCode());
		}
		if (!criteria.getNombre().equalsIgnoreCase("")) {
			query.append("AND subpro.NOMBRE LIKE ? ");
			parameters.add("%" + criteria.getNombre().toUpperCase().trim()
					+ "%");
		}
		if (criteria.getCodePrograma() != null) {
			query.append("AND pro.CODIGO = ? ");
			parameters.add(criteria.getCodePrograma());
		}
		query.append(" ORDER BY subpro.NOMBRE");

		ArrayList<SubprogramaVO> subprogramas = new ArrayList<SubprogramaVO>();
		SubprogramaVO subpro = null;
		try {
			pstmt = conn.prepareStatement(query.toString());
			pstmt = setQueryParameters(pstmt, parameters);
			rst = pstmt.executeQuery();

			while (rst.next()) {
				subpro = new SubprogramaVO();
				subpro.setCode(new Long(rst.getLong("CODIGO")));
				subpro.setNombre(rst.getString("NOMBRE"));
				subpro.setDescripcion(rst.getString("DESCRIPCION"));
				subpro.setDiasReutilizar(rst.getString("DIAS_REUTILIZAR"));
				subpro.setDiasRenovacion(rst.getString("DIAS_RENOVAR"));
				subpro.setGrupoFamiliar(rst.getString("GRUPO_FAMILIAR"));
				subpro.setValidarEstud(rst.getString("VALIDAR_CONTRA_ESTUD"));
				subpro.setValidarSisben(rst.getString("VALIDAR_CONTRA_SISBEN"));
				subpro.setDirBenObligatoria(rst
						.getString("DIRECCION_BEN_OBLIGATORIA"));
				subpro.setValorUnitarioBeneficio(rst
						.getString("VALOR_UNITARIO_BENEFICIO"));
				subpro.setDesdeVigencia(rst.getString("DESDE_VIGENCIA"));
				subpro.setHastaVigencia(rst.getString("HASTA_VIGENCIA"));
				subpro.setVigencia(rst.getString("VIGENCIA"));
				subpro.setCodePrograma(new Long(rst.getLong("COD_PROGRAMA")));
				subpro.setNombrePrograma(rst.getString("NOM_PROGRAMA"));
				subpro.setCodeUsuario(new Long(rst.getLong("COD_USUARIO")));
				subpro.setNombreUsuario(rst.getString("NOM_USUARIO"));
				subpro.setCodeCategoria(new Long(rst.getLong("COD_CATEGORIA")));
				subpro.setDescCategoria(rst.getString("NOM_CATEGORIA"));
				subpro.setCodeArea(new Long(rst.getLong("AREA_CODIGO")));
				subpro.setNombreArea(rst.getString("NOM_AREA"));
				subpro.setComentario(rst.getString("COMENTARIO"));

				subprogramas.add(subpro);
				subpro = null;
			}
			return subprogramas;
		} catch (Exception e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}
	}

	public Collection<SubprogramaVO> findSubprogramaByCriteria(
			SubprogramaVO criteria, Long codeUser, String groupUserName,
			Long areaUser) throws DAOException {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		String strSql = "SELECT DISTINCT CODIGO,NOMBRE,DESCRIPCION,DIAS_REUTILIZAR,GRUPO_FAMILIAR, "
				+ "VALIDAR_CONTRA_ESTUD,VALIDAR_CONTRA_SISBEN,DIRECCION_BEN_OBLIGATORIA,nvl(VALOR_UNITARIO_BENEFICIO,0) VALOR_UNITARIO_BENEFICIO, "
				+ "DESDE_VIGENCIA,HASTA_VIGENCIA,VIGENCIA,COD_PROGRAMA, NOM_PROGRAMA, "
				+ "COD_USUARIO,NOM_USUARIO,COD_CATEGORIA, NOM_CATEGORIA "
				+ "FROM VCS_BEN_SUBPROGRAMAS ";
		StringBuffer query = new StringBuffer(strSql);
		List<Object> parameters = new ArrayList<Object>();
		if ((Object) codeUser != null) {
			query.append(" WHERE (ususede = ? OR 'ADMINISTRADOR GENERAL' = ? OR 'SUPER USUARIO' = ? OR admSubpro = ? OR admProg = ? ");
			parameters.add(codeUser);
			parameters.add(groupUserName);
			parameters.add(groupUserName);
			parameters.add(codeUser);
			parameters.add(codeUser);
			if (groupUserName != null
					&& groupUserName.equals("ADMINISTRADOR SECRETARIA")) {
				query.append(" or AREA_CODIGO = ? ");
				parameters.add(areaUser);
			}
			query.append(" ) ");
		} else {
			return null;
		}

		if (criteria.getCode() != null) {
			query.append(" AND CODIGO = ? ");
			parameters.add(criteria.getCode());
		}
		if (!criteria.getNombre().equalsIgnoreCase("")) {
			query.append(" AND NOMBRE LIKE ? ");
			parameters.add("%" + criteria.getNombre().toUpperCase().trim()
					+ "%");
		}
		if (criteria.getCodePrograma() != null
				&& criteria.getCodePrograma().longValue() != 0) {
			query.append(" AND COD_PROGRAMA = ? ");
			parameters.add(criteria.getCodePrograma());
		}
		if (criteria.getCodeArea() != null) {
			query.append(" AND AREA_CODIGO = ? ");
			parameters.add(criteria.getCodeArea());
		}
		query.append("ORDER BY NOMBRE");

		ArrayList<SubprogramaVO> subprogramas = new ArrayList<SubprogramaVO>();
		SubprogramaVO subpro = null;
		try {
			pstmt = conn.prepareStatement(query.toString());
			pstmt = setQueryParameters(pstmt, parameters);
			rst = pstmt.executeQuery();
			while (rst.next()) {
				subpro = new SubprogramaVO();
				subpro.setCode(new Long(rst.getLong("CODIGO")));
				subpro.setNombre(rst.getString("NOMBRE"));
				subpro.setDescripcion(rst.getString("DESCRIPCION"));
				subpro.setDiasReutilizar(rst.getString("DIAS_REUTILIZAR"));
				subpro.setGrupoFamiliar(rst.getString("GRUPO_FAMILIAR"));
				subpro.setValidarEstud(rst.getString("VALIDAR_CONTRA_ESTUD"));
				subpro.setValidarSisben(rst.getString("VALIDAR_CONTRA_SISBEN"));
				subpro.setDirBenObligatoria(rst
						.getString("DIRECCION_BEN_OBLIGATORIA"));
				subpro.setValorUnitarioBeneficio(rst
						.getString("VALOR_UNITARIO_BENEFICIO"));
				subpro.setDesdeVigencia(rst.getString("DESDE_VIGENCIA"));
				subpro.setHastaVigencia(rst.getString("HASTA_VIGENCIA"));
				subpro.setVigencia(rst.getString("VIGENCIA"));
				subpro.setCodePrograma(new Long(rst.getLong("COD_PROGRAMA")));
				subpro.setNombrePrograma(rst.getString("NOM_PROGRAMA"));
				subpro.setCodeUsuario(new Long(rst.getLong("COD_USUARIO")));
				subpro.setNombreUsuario(rst.getString("NOM_USUARIO"));
				subpro.setCodeCategoria(new Long(rst.getLong("COD_CATEGORIA")));
				subpro.setDescCategoria(rst.getString("NOM_CATEGORIA"));
				subprogramas.add(subpro);
				subpro = null;
			}
			return subprogramas;
		} catch (Exception e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}
	}

	public Collection<SubprogramaVO> findAllowedSubprogramaWithGestorByCriteria(
			SubprogramaVO criteria, Long codeUser, String groupUserName,
			Long areaUser) throws DAOException {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		String strSql = "SELECT DISTINCT a.CODIGO,  a.NOMBRE,  a.DESCRIPCION, a.DIAS_REUTILIZAR, "
				+ " a.GRUPO_FAMILIAR, a.VALIDAR_CONTRA_ESTUD,  a.VALIDAR_CONTRA_SISBEN, "
				+ " a.DIRECCION_BEN_OBLIGATORIA, nvl(a.VALOR_UNITARIO_BENEFICIO,0) VALOR_UNITARIO_BENEFICIO, a.DESDE_VIGENCIA, "
				+ " a.HASTA_VIGENCIA, a.VIGENCIA,a.COD_PROGRAMA, a.NOM_PROGRAMA, a.COD_CATEGORIA, "
				+ " a.NOM_CATEGORIA, a.COD_AREA "
				+ " FROM VCS_BEN_SUBPROG_ALLOWED a, TCS_BEN_SUBP_ATR_BENEFICIARIO sab ";
		StringBuffer query = new StringBuffer(strSql);
		List<Object> parameters = new ArrayList<Object>();

		if ((Object) codeUser != null) {
			query.append(" WHERE ( 'ADMINISTRADOR GENERAL' = ? OR 'SUPER USUARIO' = ? OR admSubpro = ? OR admProg = ? OR a.permisos = ? ");
			parameters.add(groupUserName);
			parameters.add(groupUserName);
			parameters.add(codeUser);
			parameters.add(codeUser);
			parameters.add(codeUser);
			if (groupUserName != null
					&& groupUserName.equals("ADMINISTRADOR SECRETARIA")) {
				query.append(" OR a.cod_area = ");
				parameters.add(areaUser);
			}
			query.append(" ) ");
		} else {
			return null;
		}

		if (criteria.getCode() != null) {
			query.append(" AND a.CODIGO = ? ");
			parameters.add(criteria.getCode());
		}
		if (!criteria.getNombre().equalsIgnoreCase("")) {
			query.append(" AND a.NOMBRE LIKE ? ");
			parameters.add("%" + criteria.getNombre().toUpperCase().trim()
					+ "%");
		}
		if (criteria.getCodePrograma() != null) {
			query.append(" AND a.COD_PROGRAMA = ? ");
			parameters.add(criteria.getCodePrograma());
		}
		if (criteria.getCodeArea() != null) {
			query.append(" AND (a.cod_area = ? ) ");
			parameters.add(criteria.getCodeArea());
		}
		query.append(" AND a.CODIGO = sab.sbpr_codigo AND UPPER(TRIM(sab.nombre)) = 'GESTOR' ");
		query.append(" AND a.VIGENCIA = 'A' ORDER BY NOMBRE");

		ArrayList<SubprogramaVO> subprogramas = new ArrayList<SubprogramaVO>();
		SubprogramaVO subpro = null;
		try {
			pstmt = conn.prepareStatement(query.toString());
			pstmt = setQueryParameters(pstmt, parameters);
			rst = pstmt.executeQuery();

			while (rst.next()) {
				subpro = new SubprogramaVO();
				subpro.setCode(new Long(rst.getLong("CODIGO")));
				subpro.setNombre(rst.getString("NOMBRE"));
				subpro.setDescripcion(rst.getString("DESCRIPCION"));
				subpro.setDiasReutilizar(rst.getString("DIAS_REUTILIZAR"));
				subpro.setGrupoFamiliar(rst.getString("GRUPO_FAMILIAR"));
				subpro.setValidarEstud(rst.getString("VALIDAR_CONTRA_ESTUD"));
				subpro.setValidarSisben(rst.getString("VALIDAR_CONTRA_SISBEN"));
				subpro.setDirBenObligatoria(rst
						.getString("DIRECCION_BEN_OBLIGATORIA"));
				subpro.setValorUnitarioBeneficio(rst
						.getString("VALOR_UNITARIO_BENEFICIO"));
				subpro.setDesdeVigencia(rst.getString("DESDE_VIGENCIA"));
				subpro.setHastaVigencia(rst.getString("HASTA_VIGENCIA"));
				subpro.setVigencia(rst.getString("VIGENCIA"));
				subpro.setCodePrograma(new Long(rst.getLong("COD_PROGRAMA")));
				subpro.setNombrePrograma(rst.getString("NOM_PROGRAMA"));
				subpro.setCodeCategoria(new Long(rst.getLong("COD_CATEGORIA")));
				subpro.setDescCategoria(rst.getString("NOM_CATEGORIA"));
				subprogramas.add(subpro);
				subpro = null;
			}
			return subprogramas;
		} catch (Exception e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}
	}

	public Collection<SubprogramaVO> findSubprograma(SubprogramaVO criteria,
			Long codeUser, String groupUserName, Long areaUser)
			throws DAOException {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		List<Object> parameters = new ArrayList<Object>();

		String strSql = "SELECT DISTINCT COD_SUBPRO,  NOM_SUBPRO,  DESC_SUBPRO, FCS_BEN_TIENE_SEDE(COD_SUBPRO) TIENE_SEDE, "
				+ "DREU_SUBPRO,  GRFAM_SUBPRO, VCR_SUBPRO, "
				+ " VCS_SUBPRO, DIROBL_SUBPRO, VALOR_SUBPRO, "
				+ " DESDE_SUBPRO, HASTA_SUBPRO, VIGENCIA_SUBPRO,COD_PROGRAMA, "
				+ "NOM_PROGRAMA, COD_USUARIO, NOM_USUARIO, "
				+ "COD_CATEGORIA,  NOM_CATEGORIA, cod_area, cod_area_prog "
				+ "FROM VCS_BEN_SOLO_SUBPROG_EST_VIG ";
		StringBuffer query = new StringBuffer(strSql);

		if ((Object) codeUser != null) {
			query.append(" WHERE ( 'ADMINISTRADOR GENERAL' = ? OR 'SUPER USUARIO' = ? OR admSubpro = ? OR admProg = ? ");
			parameters.add(groupUserName);
			parameters.add(groupUserName);
			parameters.add(codeUser);
			parameters.add(codeUser);
			if (groupUserName != null
					&& groupUserName.equals("ADMINISTRADOR SECRETARIA")) {
				query.append(" OR cod_area_prog = ? ");
				parameters.add(areaUser);
			}
			query.append(" ) ");
		} else {
			return null;
		}

		if (criteria.getCode() != null) {
			query.append(" AND COD_SUBPRO = ? ");
			parameters.add(criteria.getCode());
		}
		if (!criteria.getNombre().equalsIgnoreCase("")) {
			query.append(" AND NOM_SUBPRO LIKE ? ");
			parameters.add("%" + criteria.getNombre().toUpperCase().trim()
					+ "%");
		}
		if (criteria.getCodePrograma() != null) {
			query.append(" AND COD_PROGRAMA = ? ");
			parameters.add(criteria.getCodePrograma());
		}
		if (criteria.getCodeArea() != null) {
			query.append(" AND (cod_area = ? OR cod_area_prog = ? ) ");
			parameters.add(criteria.getCodeArea());
			parameters.add(criteria.getCodeArea());
		}
		query.append(" ORDER BY NOM_SUBPRO");
		System.out.println("findSubprograma: " + query.toString());
		for (Object ob : parameters) {
			System.out.println(ob.toString());
		}
		ArrayList<SubprogramaVO> subprogramas = new ArrayList<SubprogramaVO>();
		try {
			pstmt = conn.prepareStatement(query.toString());
			pstmt = setQueryParameters(pstmt, parameters);
			rst = pstmt.executeQuery();

			SubprogramaVO subpro = null;
			while (rst.next()) {
				subpro = new SubprogramaVO();
				subpro.setCode(new Long(rst.getLong("COD_SUBPRO")));
				subpro.setNombre(rst.getString("NOM_SUBPRO"));
				subpro.setDescripcion(rst.getString("DESC_SUBPRO"));
				subpro.setDiasReutilizar(rst.getString("DREU_SUBPRO"));
				subpro.setGrupoFamiliar(rst.getString("GRFAM_SUBPRO"));
				subpro.setValidarEstud(rst.getString("VCR_SUBPRO"));
				subpro.setValidarSisben(rst.getString("VCS_SUBPRO"));
				subpro.setDirBenObligatoria(rst.getString("DIROBL_SUBPRO"));
				subpro.setValorUnitarioBeneficio(rst.getString("VALOR_SUBPRO"));
				subpro.setDesdeVigencia(rst.getString("DESDE_SUBPRO"));
				subpro.setHastaVigencia(rst.getString("HASTA_SUBPRO"));
				subpro.setVigencia(rst.getString("VIGENCIA_SUBPRO"));
				subpro.setCodePrograma(new Long(rst.getLong("COD_PROGRAMA")));
				subpro.setNombrePrograma(rst.getString("NOM_PROGRAMA"));
				subpro.setCodeUsuario(new Long(rst.getLong("COD_USUARIO")));
				subpro.setNombreUsuario(rst.getString("NOM_USUARIO"));
				subpro.setCodeCategoria(new Long(rst.getLong("COD_CATEGORIA")));
				subpro.setDescCategoria(rst.getString("NOM_CATEGORIA"));
				subpro.setTieneSede(rst.getString("TIENE_SEDE"));
				subprogramas.add(subpro);
				subpro = null;
			}
		} catch (Exception e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}
		return subprogramas;
	}

	public Collection<SubprogramaVO> findAllowedSubprograma(
			SubprogramaVO criteria, Long codeUser, String groupUserName,
			Long areaUser) throws DAOException {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		List<SubprogramaVO> subprogramas = new ArrayList<SubprogramaVO>();
		String strSql = "SELECT DISTINCT CODIGO,  NOMBRE,  DESCRIPCION, DIAS_REUTILIZAR, "
				+ " GRUPO_FAMILIAR, VALIDAR_CONTRA_ESTUD,  VALIDAR_CONTRA_SISBEN, "
				+ " DIRECCION_BEN_OBLIGATORIA, nvl(VALOR_UNITARIO_BENEFICIO,0) VALOR_UNITARIO_BENEFICIO, DESDE_VIGENCIA, "
				+ " HASTA_VIGENCIA, VIGENCIA,COD_PROGRAMA, NOM_PROGRAMA, COD_CATEGORIA, "
				+ " NOM_CATEGORIA, COD_AREA "
				+ " FROM VCS_BEN_SUBPROG_ALLOWED a ";
		StringBuffer query = new StringBuffer(strSql);
		List<Object> parameters = new ArrayList<Object>();
		if ((Object) codeUser != null) {
			query.append(" WHERE ( 'ADMINISTRADOR GENERAL' = ? OR 'SUPER USUARIO' = ? OR admSubpro = ? OR admProg = ? OR a.permisos = ? ");
			parameters.add(groupUserName);
			parameters.add(groupUserName);
			parameters.add(codeUser);
			parameters.add(codeUser);
			parameters.add(codeUser);
			if (groupUserName != null
					&& groupUserName.equals("ADMINISTRADOR SECRETARIA")) {
				query.append(" OR cod_area = ? ");
				parameters.add(areaUser);
			}
			query.append(" ) ");
		} else
			return null;

		if (criteria.getCode() != null) {
			query.append(" AND CODIGO = ? ");
			parameters.add(criteria.getCode());
		}
		if (!criteria.getNombre().equalsIgnoreCase("")) {
			query.append(" AND NOMBRE LIKE ? ");
			parameters.add("%" + criteria.getNombre().toUpperCase().trim()
					+ "%");
		}
		if (criteria.getCodePrograma() != null) {
			query.append(" AND COD_PROGRAMA = ? ");
			parameters.add(criteria.getCodePrograma());
		}
		if (criteria.getCodeArea() != null) {
			query.append(" AND (cod_area = ? ) ");
			parameters.add(criteria.getCodeArea());
		}
		query.append(" AND a.VIGENCIA = 'A' ORDER BY NOMBRE");

		try {
			pstmt = conn.prepareStatement(query.toString());
			pstmt = setQueryParameters(pstmt, parameters);
			rst = pstmt.executeQuery();
			SubprogramaVO subpro = null;
			while (rst.next()) {
				subpro = new SubprogramaVO();
				subpro.setCode(new Long(rst.getLong("CODIGO")));
				subpro.setNombre(rst.getString("NOMBRE"));
				subpro.setDescripcion(rst.getString("DESCRIPCION"));
				subpro.setDiasReutilizar(rst.getString("DIAS_REUTILIZAR"));
				subpro.setGrupoFamiliar(rst.getString("GRUPO_FAMILIAR"));
				subpro.setValidarEstud(rst.getString("VALIDAR_CONTRA_ESTUD"));
				subpro.setValidarSisben(rst.getString("VALIDAR_CONTRA_SISBEN"));
				subpro.setDirBenObligatoria(rst
						.getString("DIRECCION_BEN_OBLIGATORIA"));
				subpro.setValorUnitarioBeneficio(rst
						.getString("VALOR_UNITARIO_BENEFICIO"));
				subpro.setDesdeVigencia(rst.getString("DESDE_VIGENCIA"));
				subpro.setHastaVigencia(rst.getString("HASTA_VIGENCIA"));
				subpro.setVigencia(rst.getString("VIGENCIA"));
				subpro.setCodePrograma(new Long(rst.getLong("COD_PROGRAMA")));
				subpro.setNombrePrograma(rst.getString("NOM_PROGRAMA"));
				subpro.setCodeCategoria(new Long(rst.getLong("COD_CATEGORIA")));
				subpro.setDescCategoria(rst.getString("NOM_CATEGORIA"));
				subprogramas.add(subpro);
				subpro = null;
			}
		} catch (Exception e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}
		return subprogramas;
	}

	public SubprogramaVO findPropiedadesSubprograma(long codeSubpro)
			throws DAOException {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		String query = "SELECT DIAS_REUTILIZAR,CAMPO_A3 FROM TCS_BEN_SUBPROGRAMA WHERE CODIGO = ? ";
		SubprogramaVO subpro = null;
		try {
			pstmt = conn.prepareStatement(query);
			pstmt.setLong(1, codeSubpro);
			rst = pstmt.executeQuery();
			if (rst.next()) {
				subpro = new SubprogramaVO();
				subpro.setDiasReutilizar(rst.getString("DIAS_REUTILIZAR"));
				subpro.setDiasRenovacion(rst.getString("CAMPO_A3"));
			}
		} catch (Exception e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}
		return subpro;
	}

	public String findMaxCodigo() throws DAOException {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		String codigo = "";
		String strSql = "Select MAX(codigo) max_codigo FROM tcs_ben_subprograma";
		try {
			pstmt = conn.prepareStatement(strSql);
			rst = pstmt.executeQuery();
			if (rst.next()) {
				codigo = rst.getString("max_codigo");
			}
			return codigo;
		} catch (Exception e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}
	}

	public int insertBeneficio(SubprogramaForm subform, String user,
			String strTerminal, String strDate) throws DAOException {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		String query = " Insert INTO tcs_ben_subprograma (CODIGO, PRG_CODIGO, USU_CODIGO, "
				+ " NOMBRE, DESCRIPCION, DIAS_REUTILIZAR, GRUPO_FAMILIAR, "
				+ " VALIDAR_CONTRA_ESTUD, VALIDAR_CONTRA_SISBEN, VALOR_UNITARIO_BENEFICIO, "
				+ " DESDE_VIGENCIA, HASTA_VIGENCIA, VIGENCIA, AREA_CODIGO,CAMPO_A3, CAMPO_A1, "
				+ " usuario_crea, fecha_crea, terminal_crea, usuario_modifica, fecha_modifica, terminal_modifica) "
				+ " values (SCS_BEN_SBPR.NEXTVAL,?,?,upper(?),upper(?),?,?,?,?,?,to_date(?,'dd/mm/rrrr'),to_date(?,'dd/mm/rrrr'),'A',?,?,?,?,to_date(?,'dd/mm/rrrr'),?,?,to_date(?,'dd/mm/rrrr'),?) ";
		try {
			pstmt = conn.prepareStatement(query);
			pstmt.setString(1, subform.getCodePrograma());
			pstmt.setString(2, subform.getAdmincodigo1());
			pstmt.setString(3, subform.getSubprograma().trim());
			pstmt.setString(4, subform.getDescripcion());
			pstmt.setString(5, subform.getDias());
			pstmt.setString(6, subform.getGrupfam());
			pstmt.setString(7, "N");
			pstmt.setString(8, subform.getSisben());
			pstmt.setString(9, subform.getValor());
			pstmt.setString(10, subform.getDesde());
			pstmt.setString(11, subform.getHasta());
			pstmt.setString(12, subform.getSubsecretaria());
			pstmt.setString(13, subform.getDiasrenovar());
			pstmt.setString(14, subform.getSolounavez());
			pstmt.setString(15, user);
			pstmt.setString(16, strDate);
			pstmt.setString(17, strTerminal);
			pstmt.setString(18, user);
			pstmt.setString(19, strDate);
			pstmt.setString(20, strTerminal);

			return pstmt.executeUpdate();
			/*
			 * String Arr[] = { subform.getCodePrograma(),
			 * subform.getAdmincodigo1(), subform.getSubprograma().trim(),
			 * subform.getDescripcion(), subform.getDias(),
			 * subform.getGrupfam(), "N", subform.getSisben(),
			 * subform.getValor(), subform.getDesde(), subform.getHasta(),
			 * subform.getSubsecretaria(), subform.getDiasrenovar(),
			 * subform.getSolounavez(), user, strDate, strTerminal, user,
			 * strDate, strTerminal };
			 */
		} catch (Exception e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}
	}

	public boolean findEstadoSubprogramaByCodigo(long codigo)
			throws DAOException {
		PreparedStatement pstmt = null;
		ResultSet rst = null;
		String query = "SELECT  codigo FROM tcs_ben_subprograma WHERE  vigencia = 'I' AND codigo = ? ";
		try {
			pstmt = conn.prepareStatement(query);
			pstmt.setLong(1, codigo);
			rst = pstmt.executeQuery();
			if (rst.next()) {
				return true;
			} else {
				return false;
			}
		} catch (Exception e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}
	}

	public Collection<SubprogramaVO> findActivarSubprogramas(long codePrograma)
			throws DAOException {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		String query = " SELECT sub.nombre nombre, sub.codigo codigo, prog.nombre nombrepro "
				+ " FROM TCS_BEN_SUBPROGRAMA sub, TCS_BEN_PROGRAMA prog "
				+ " WHERE (sub.vigencia <> 'A' OR SYSDATE > sub.HASTA_VIGENCIA) AND sub.PRG_CODIGO = prog.CODIGO AND "
				+ " prog.codigo = ? ";

		List<SubprogramaVO> subprogramas = new ArrayList<SubprogramaVO>();
		try {
			pstmt = conn.prepareStatement(query);
			pstmt.setLong(1, codePrograma);
			rst = pstmt.executeQuery();
			SubprogramaVO subpro = null;
			while (rst.next()) {
				subpro = new SubprogramaVO();
				subpro.setCode(new Long(rst.getString("codigo")));
				subpro.setNombre(rst.getString("nombre"));
				subpro.setNombrePrograma(rst.getString("nombrepro"));
				subprogramas.add(subpro);
				subpro = null;
			}
		} catch (Exception e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}
		return subprogramas;
	}

	public Collection<SubprogramaVO> findActivarSubprogramas(Long codeUser,
			String groupUserName, Long areaUser) throws DAOException {
		Connection con = null;
		PreparedStatement pstmt = null;
		ResultSet rst = null;
		List<Object> parameters = new ArrayList<Object>();
		StringBuffer query = new StringBuffer(
				"SELECT * FROM VCS_BEN_SOLO_SUBPROGRAMAS ");
		if ((Object) codeUser != null) {
			query.append(" where ( 'ADMINISTRADOR GENERAL' = ? OR 'SUPER USUARIO' = ? OR admSubpro = ? OR admProg = ? ");
			parameters.add(groupUserName);
			parameters.add(groupUserName);
			parameters.add(codeUser);
			parameters.add(codeUser);
			if (groupUserName != null
					&& groupUserName.equals("ADMINISTRADOR SECRETARIA")) {
				query.append(" OR AREA_CODIGO = ? ");
				parameters.add(areaUser);
			}
			query.append(" ) ");
		}
		query.append(" AND (VIGENCIA_SUBPRO = 'I' OR sysdate > HASTA_SUBPRO) ");
		ArrayList<SubprogramaVO> subprogramas = new ArrayList<SubprogramaVO>();

		try {
			pstmt = conn.prepareStatement(query.toString());
			pstmt = setQueryParameters(pstmt, parameters);
			rst = pstmt.executeQuery();
			SubprogramaVO subpro = null;
			while (rst.next()) {
				subpro = new SubprogramaVO();
				subpro.setCode(new Long(rst.getString("COD_SUBPRO")));
				subpro.setNombre(rst.getString("NOM_SUBPRO"));
				subpro.setNombrePrograma(rst.getString("NOM_PROGRAMA"));
				subprogramas.add(subpro);
				subpro = null;
			}
		} catch (Exception e) {
			throw new DAOException(e);
		} finally {
			close(con, pstmt, rst);
		}
		return subprogramas;
	}

	public Collection<SubprogramaVO> findSubprogramasVigentes(
			SubprogramaVO criteria, Long codeUser, String groupUserName,
			Long areaUser) throws DAOException {
		PreparedStatement pstmt = null;
		ResultSet rst = null;
		List<Object> parameters = new ArrayList<Object>();
		StringBuffer query = new StringBuffer(
				"SELECT DISTINCT CODIGO, NOMBRE, DESCRIPCION, "
						+ "DIAS_REUTILIZAR, GRUPO_FAMILIAR, VALIDAR_CONTRA_ESTUD, "
						+ "VALIDAR_CONTRA_SISBEN, DIRECCION_BEN_OBLIGATORIA, nvl(VALOR_UNITARIO_BENEFICIO,0) VALOR_UNITARIO_BENEFICIO, "
						+ "DESDE_VIGENCIA, HASTA_VIGENCIA, VIGENCIA,COD_PROGRAMA, "
						+ "NOM_PROGRAMA, COD_CATEGORIA,  NOM_CATEGORIA, AREA_CODIGO "
						+ "FROM VCS_BEN_SUBPROG_ALLOWED ");
		if ((Object) codeUser != null) {
			query.append(" WHERE ( 'ADMINISTRADOR GENERAL' = ? OR 'SUPER USUARIO' = ? OR admSubpro = ? OR admProg = ? ");
			parameters.add(groupUserName);
			parameters.add(groupUserName);
			parameters.add(codeUser);
			parameters.add(codeUser);

			if (groupUserName != null
					&& groupUserName.equals("ADMINISTRADOR SECRETARIA")) {
				query.append(" OR AREA_CODIGO = ? ");
				parameters.add(areaUser);
			}
			query.append(" ) ");
		} else {
			return null;
		}
		if (criteria.getCode() != null) {
			query.append(" AND CODIGO = ? ");
			parameters.add(criteria.getCode());
		}
		if (criteria.getCodePrograma() != null
				&& criteria.getCodePrograma().longValue() != 0) {
			query.append(" AND COD_PROGRAMA = ? ");
			parameters.add(criteria.getCodePrograma());
		}
		if (areaUser != null && areaUser.longValue() != 0) {
			query.append(" AND (AREA_CODIGO = ?) ");// + areaUser.longValue() +
													// ") ";
			parameters.add(new Long(areaUser.longValue()));
		}
		query.append(" AND VIGENCIA <> 'I' " + " ORDER BY NOMBRE");
		ArrayList<SubprogramaVO> subprogramas = new ArrayList<SubprogramaVO>();
		// System.out.println(query.toString());
		try {
			pstmt = conn.prepareStatement(query.toString());
			pstmt = setQueryParameters(pstmt, parameters);
			rst = pstmt.executeQuery();

			while (rst.next()) {
				SubprogramaVO subpro = new SubprogramaVO();
				subpro.setCode(new Long(rst.getLong("CODIGO")));
				subpro.setNombre(rst.getString("NOMBRE"));
				subpro.setDescripcion(rst.getString("DESCRIPCION"));
				subpro.setDiasReutilizar(rst.getString("DIAS_REUTILIZAR"));
				subpro.setGrupoFamiliar(rst.getString("GRUPO_FAMILIAR"));
				subpro.setValidarEstud(rst.getString("VALIDAR_CONTRA_ESTUD"));
				subpro.setValidarSisben(rst.getString("VALIDAR_CONTRA_SISBEN"));
				subpro.setDirBenObligatoria(rst
						.getString("DIRECCION_BEN_OBLIGATORIA"));
				subpro.setValorUnitarioBeneficio(rst
						.getString("VALOR_UNITARIO_BENEFICIO"));
				subpro.setDesdeVigencia(rst.getString("DESDE_VIGENCIA"));
				subpro.setHastaVigencia(rst.getString("HASTA_VIGENCIA"));
				subpro.setVigencia(rst.getString("VIGENCIA"));
				subpro.setCodePrograma(new Long(rst.getLong("COD_PROGRAMA")));
				subpro.setNombrePrograma(rst.getString("NOM_PROGRAMA"));
				subpro.setCodeCategoria(new Long(rst.getLong("COD_CATEGORIA")));
				subpro.setDescCategoria(rst.getString("NOM_CATEGORIA"));
				subprogramas.add(subpro);
			}
		} catch (Exception e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}
		return subprogramas;
	}

	public String findNombreByCodigo(long codeSub) throws DAOException {
		PreparedStatement pstmt = null;
		ResultSet rst = null;
		String strName = null;

		String query = "SELECT nombre FROM tcs_ben_subprograma "
				+ "WHERE codigo = ? ";
		try {
			pstmt = conn.prepareStatement(query);
			pstmt.setLong(1, codeSub);
			rst = pstmt.executeQuery();
			if (rst.next()) {
				strName = rst.getString("nombre");
			}
			return strName;
		} catch (Exception e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}
	}

	public String findCodigoSubprogramaByCodigoBOT(long codeBOT)
			throws DAOException {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		String query = " SELECT SBPR_CODIGO "
				+ " FROM TCS_BEN_BENEFICIO_OTORGADO WHERE codigo = ? ";
		try {
			pstmt = conn.prepareStatement(query);
			pstmt.setLong(1, codeBOT);
			rst = pstmt.executeQuery();
			if (rst.next()) {
				return rst.getString("SBPR_CODIGO");
			} else {
				throw new DAOException("Not found.");
			}
		} catch (Exception e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}
	}

	public boolean isRelacionadoConSede(long codeSub) throws DAOException {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		String query = " SELECT COUNT(DISTINCT CODIGO) Cantidad "
				+ " FROM VCS_BEN_SUBPROGRAMAS WHERE CODIGO = ? ";

		try {
			pstmt = conn.prepareStatement(query);
			pstmt.setLong(1, codeSub);
			rst = pstmt.executeQuery();
			rst.next();
			if (rst.getInt("Cantidad") == 0) {
				return false;
			} else {
				return true;
			}
		} catch (Exception e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}
	}

	public String findCodigoProgramaByCodigoSubprograma(long codeSubprograma)
			throws DAOException {
		Connection con = null;
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		String query = "SELECT PRG_CODIGO FROM TCS_BEN_SUBPROGRAMA "
				+ " WHERE CODIGO = ? ";// + codeSubprograma";" +
		try {
			con = ConexionFactory.getInstance().getConnection();
			pstmt = con.prepareStatement(query);
			pstmt.setLong(1, codeSubprograma);
			rst = pstmt.executeQuery();
			if (rst.next()) {
				return rst.getString("PRG_CODIGO");
			} else {
				throw new DAOException("Not found");
			}
		} catch (Exception e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}

	}

	public boolean isSubprogramaParaGrupoFamiliar(Long codeSubprograma)
			throws DAOException {
		PreparedStatement pstmt = null;
		ResultSet rst = null;
		try {
			pstmt = conn
					.prepareStatement(SELECT_GF_FROM_TCS_BEN_SUBPROG_BY_CODESUBP);
			pstmt.setLong(1, codeSubprograma.longValue());
			rst = pstmt.executeQuery();
			return rst.next() ? true : false;
		} catch (Exception e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}
	}

	public int insertBeneficioOtorgado(String[] strArr, int i,
			String fechaBeneficio) throws DAOException {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		String queryFecha = "SELECT TO_CHAR((SELECT TO_DATE(?,'dd/mm/RRRR') FROM dual)+?,'dd/mm/RRRR') fecha FROM dual ";
		String fecha;
		try {
			pstmt = conn.prepareStatement(queryFecha);
			pstmt.setString(1, fechaBeneficio);
			pstmt.setInt(2, i);
			rst = pstmt.executeQuery();
			if (rst.next()) {
				fecha = rst.getString("fecha");
			} else {
				fecha = "sysdate";
			}
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}
		String query = "INSERT INTO TCS_BEN_BENEFICIO_OTORGADO (CODIGO, SBPR_CODIGO, "
				+ " BEN_CODIGO, SEDE_CODIGO, TERCERO, FECHA_BENEFICIO, CAMPO_F1, VALOR_BENEFICIO, TIPO_BENEFICIO, "
				+ " USUARIO_CREA, TERMINAL_CREA, USUARIO_MODIFICA, TERMINAL_MODIFICA) "
				+ " VALUES(SCS_BEN_BOT.NEXTVAL, ?, ?, ?, ?, TO_DATE(?,'dd/mm/RRRR'), TO_DATE(sysdate,'dd/mm/RRRR'), ?, ?, ?, ?, ?, ?)";
		/*
		 * { strCodeSubpro, strCodeBeneficiario, strCodeSede, Tercero,
		 * CostBenefit, TypeBenefit, strArrIns[0], strArrIns[1], strArrIns[0],
		 * strArrIns[1] }
		 */
		try {
			pstmt = conn.prepareStatement(query);
			pstmt.setLong(1, new Long(strArr[0]).longValue());// sbpr_codigo
			pstmt.setLong(2, new Long(strArr[1]).longValue());// ben_codigo
			pstmt.setLong(3, new Long(strArr[2]).longValue());// sede_codigo
			pstmt.setString(4, strArr[3]);// tercero
			pstmt.setString(5, fecha);// fecha_beneficio
			pstmt.setString(6, strArr[4]);// valor_beneficio
			pstmt.setString(7, strArr[5]);// tipo_beneficio
			pstmt.setString(8, strArr[6]);// usuario_crea
			pstmt.setString(9, strArr[7]);// terminal_crea
			pstmt.setString(10, strArr[8]);// usuario_modifica
			pstmt.setString(11, strArr[9]);// terminal_modifica
			return pstmt.executeUpdate();
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(pstmt);
		}

	}

	public int insertBeneficioOtorgadoEmpresa(String[] strArr, int i,
			String fechaBeneficio) throws DAOException {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		String queryFecha = "SELECT TO_CHAR((SELECT TO_DATE(?,'dd/mm/RRRR') FROM dual)+?,'dd/mm/RRRR') fecha FROM dual ";
		String fecha;
		try {
			pstmt = conn.prepareStatement(queryFecha);
			pstmt.setString(1, fechaBeneficio);
			pstmt.setInt(2, i);
			rst = pstmt.executeQuery();
			if (rst.next()) {
				fecha = rst.getString("fecha");
			} else {
				fecha = "sysdate";
			}
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}
		// TODO: ben_codigo
		String query = "INSERT INTO TCS_BEN_BENEFICIO_OTORGADO (CODIGO, SBPR_CODIGO, "
				+ " BEN_CODIGO, SEDE_CODIGO, TERCERO, FECHA_BENEFICIO, CAMPO_F1, VALOR_BENEFICIO, TIPO_BENEFICIO, "
				+ " USUARIO_CREA, TERMINAL_CREA, USUARIO_MODIFICA, TERMINAL_MODIFICA, CAMPO_N3) "
				+ " VALUES(SCS_BEN_BOT.NEXTVAL, ?, ?, ?, ?, TO_DATE(?,'dd/mm/RRRR'), TO_DATE(sysdate,'dd/mm/RRRR'), ?, ?, ?, ?, ?, ?, ?)";
		/*
		 * { strCodeSubpro, strCodeBeneficiario, strCodeSede, Tercero,
		 * CostBenefit, TypeBenefit, strArrIns[0], strArrIns[1], strArrIns[0],
		 * strArrIns[1] }
		 */
		try {
			pstmt = conn.prepareStatement(query);
			pstmt.setLong(1, new Long(strArr[0]).longValue());// sbpr_codigo
			// pstmt.setLong(2, new Long(strArr[1]).longValue());// ben_codigo
			pstmt.setLong(2, 7693004);// ben_codigo
			pstmt.setLong(3, new Long(strArr[2]).longValue());// sede_codigo
			pstmt.setString(4, strArr[3]);// tercero
			pstmt.setString(5, fecha);// fecha_beneficio
			pstmt.setString(6, strArr[4]);// valor_beneficio
			pstmt.setString(7, strArr[5]);// tipo_beneficio
			pstmt.setString(8, strArr[6]);// usuario_crea
			pstmt.setString(9, strArr[7]);// terminal_crea
			pstmt.setString(10, strArr[8]);// usuario_modifica
			pstmt.setString(11, strArr[9]);// terminal_modifica
			pstmt.setString(12, strArr[1]);// campo_n3 (codigo empresa)
			return pstmt.executeUpdate();
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(pstmt);
		}

	}

	public int updateBeneficioOtorgado(String[] strArr, int i,
			String dateBenefit, String codeBot) throws DAOException {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		String fecha = "SELECT TO_CHAR((SELECT TO_DATE(?,'dd/mm/RRRR') FROM dual)+?,'dd/mm/RRRR') fecha FROM dual ";
		try {
			pstmt = conn.prepareStatement(fecha);
			pstmt.setString(1, dateBenefit);
			pstmt.setInt(2, i);
			rst = pstmt.executeQuery();
			if (rst.next()) {
				fecha = rst.getString("fecha");
			} else {
				fecha = "sysdate";
			}
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}

		String strSql = "{call PCS_BEN_UPDATE_BOT(?, ?, ?, ?, ?, ?, ?, ?)}";
		System.out.println(strSql);
		System.out
				.println(strArr[0] + " " + strArr[1] + " " + fecha + " "
						+ strArr[2] + " " + strArr[3] + " " + strArr[4] + " "
						+ codeBot);

		CallableStatement cs = null;

		try {
			cs = conn.prepareCall(strSql);
			cs.setString(1, strArr[0]); // codigoSede
			cs.setString(2, strArr[1]); // terceroParam
			cs.setString(3, fecha); // fechaBeneficio
			cs.setString(4, strArr[2]); // valorBeneficio
			cs.setString(5, strArr[3]); // usuarioModif
			cs.setString(6, strArr[4]); // terminalModif
			cs.setString(7, codeBot); // codigoBOT
			cs.registerOutParameter(8, Types.INTEGER); // vn_updated

			cs.execute();
			return cs.getInt(8);
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(cs);
		}
	}

	public int updateBeneficioOtorgado(String[] strArr, int i,
			String dateBenefit, String codeBot, String tipoBot)
			throws DAOException {
		PreparedStatement psmt = null;
		ResultSet rst = null;

		String fecha = "SELECT TO_CHAR((SELECT TO_DATE(?,'dd/mm/RRRR') FROM dual)+?,'dd/mm/RRRR') fecha FROM dual ";
		try {
			psmt = conn.prepareStatement(fecha);
			psmt.setString(1, dateBenefit);
			psmt.setInt(2, i);
			rst = psmt.executeQuery();
			if (rst.next()) {
				fecha = rst.getString("fecha");
			} else {
				fecha = "sysdate";
			}
		} catch (SQLException e) {
			throw new DAOException(e);
		}

		String strSql = "{call PCS_BEN_UPDATE_BOT_NEWTP(?, ?, ?, ?, ?, ?, ?, ?, ?)}";

		CallableStatement cs = null;
		try {
			cs = conn.prepareCall(strSql);
			cs.setString(1, strArr[0]);
			cs.setString(2, strArr[1]);
			cs.setString(3, fecha);
			cs.setString(4, strArr[2]);
			cs.setString(5, tipoBot);
			cs.setString(6, strArr[3]);
			cs.setString(7, strArr[4]);
			cs.setString(8, codeBot);
			cs.registerOutParameter(9, Types.INTEGER);

			cs.execute();
			return cs.getInt(9);
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(cs);
		}
	}

	public String findCodMaxBenOtor() throws DAOException {
		Statement stmt = null;
		ResultSet rst = null;

		String codigo = "";
		String strSql = "SELECT SCS_BEN_BOT.currval CODEMAX FROM dual";
		try {
			stmt = conn.createStatement();
			rst = stmt.executeQuery(strSql);

			while (rst.next()) {
				codigo = rst.getString("CODEMAX");
			}
			return codigo;
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(rst, stmt);
		}
	}

	public String findCantidadDisponible() throws DAOException {
		Statement stmt = null;
		ResultSet rst = null;

		String codigo = "";
		String strSql = "SELECT MAX(CODIGO) CODEMAX FROM TCS_BEN_BENEFICIO_OTORGADO";
		try {
			stmt = conn.createStatement();
			rst = stmt.executeQuery(strSql);

			while (rst.next()) {
				codigo = rst.getString("CODEMAX");
			}
			return codigo;
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(rst, stmt);
		}
	}

	public SubprogramaVO findSubprogramaByCodigo(Long codeSubprograma) {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		String strSql = "SELECT subp.codigo, subp.prg_codigo, subp.usu_codigo, subp.area_codigo, subp.nombre, subp.descripcion, subp.dias_reutilizar, "
				+ " subp.grupo_familiar, subp.validar_contra_sisben, subp.direccion_ben_obligatoria, subp.valor_unitario_beneficio, "
				+ " subp.desde_vigencia, subp.hasta_vigencia, subp.vigencia, "
				+ " prog.nombre programa_nombre "
				+ " FROM tcs_ben_subprograma subp "
				+ " JOIN tcs_ben_programa prog "
				+ " ON subp.prg_codigo = prog.codigo WHERE subp.codigo = ?";
		try {
			pstmt = conn.prepareStatement(strSql);
			pstmt.setLong(1, codeSubprograma);
			rst = pstmt.executeQuery();
			SubprogramaVO vo = null;

			if (rst.next()) {
				vo = new SubprogramaVO();
				vo.setCode(rst.getLong("CODIGO"));
				vo.setCodePrograma(rst.getLong("PRG_CODIGO"));
				vo.setCodeUsuario(rst.getLong("USU_CODIGO"));
				vo.setCodeArea(rst.getLong("AREA_CODIGO"));
				vo.setNombre(rst.getString("NOMBRE"));
				vo.setDescripcion(rst.getString("DESCRIPCION"));
				vo.setDiasReutilizar(rst.getString("DIAS_REUTILIZAR"));
				vo.setGrupoFamiliar(rst.getString("GRUPO_FAMILIAR"));
				vo.setValidarSisben(rst.getString("VALIDAR_CONTRA_SISBEN"));
				vo.setDirBenObligatoria(rst
						.getString("DIRECCION_BEN_OBLIGATORIA"));
				vo.setValorUnitarioBeneficio(rst
						.getString("VALOR_UNITARIO_BENEFICIO"));
				vo.setDesdeVigencia(rst.getString("DESDE_VIGENCIA"));
				vo.setHastaVigencia(rst.getString("HASTA_VIGENCIA"));
				vo.setVigencia(rst.getString("VIGENCIA"));

				vo.setNombrePrograma(rst.getString("PROGRAMA_NOMBRE"));
			}
			return vo;
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}
	}
}
